#include "fractie.h"
#include <iostream.h>
int fractie::cmmdc(int x,int y){   //calculeaza si returneaza cmmdc pentru x, y
int z; if (x==0 || y==1) return 1;
if (x<0) x=-x;
if (y<0) y=-y;
while (x!=0){
if (y>x) {z=x;x=y;y=z;}
x%=y;
}return y;}

void fractie::simplifica()
{int cd;
if (nmt<0) {
    nrt=-nrt;nmt=-nmt;}
if (nmt>1){
    cd=cmmdc(nrt,nmt);
    if (cd>1) {
        nrt/=cd; nmt/=cd; }
        }
}
fractie::fractie(int nri, int nmi){
    nrt=nri;
    nmt=nmi;
    simplifica();
    cout<<"Constructor!\n";}

fractie operator +(const fractie f1, const fractie f2){
    int dc; fractie f;
    dc=cmmdc(f1.nmt,f2.nmt);
    f.nmt=(f1.nmt/dc)*f2.nmt;
    f.nrt=f1.nrt*(f2.nmt/dc)+f2.nrt*(f1.nmt/dc);
    f.simplifica();return f;}

fractie operator -(const fractie f1, const fractie f2){
    int dc; fractie f;dc=cmmdc(f1.nmt,f2.nmt);
    f.nmt=(f1.nmt/dc)*f2.nmt;
    f.nrt=f1.nrt*(f2.nmt/dc) - f2.nrt*(f1.nmt/dc);
    f.simplifica();
    return f;}
fractie operator * (fractie f1, fractie f2){
    int dc;
    fractie f;
    dc=cmmdc(f1.nrt,f2.nmt);
    if (dc>1) {
        f1.nrt/=dc;f2.nmt/=dc;}
    dc=cmmdc(f2.nrt,f1.nmt);
    if (dc>1) {
        f2.nrt/=dc;f1.nmt/=dc;}
    f.nrt=f1.nrt*f2.nrt;
     f.nmt=f1.nmt*f2.nmt;
     return f; }
fractie operator / (fractie f1, fractie f2){
    int dc;fractie f;
    dc=cmmdc(f1.nrt,f2.nrt);
    if (dc>1) {
        f1.nrt/=dc;f2.nrt/=dc;}
    dc=cmmdc(f2.nmt,f1.nmt);
    if (dc>1) {
        f2.nmt/=dc;f1.nmt/=dc;}
    f.nrt=f1.nrt*f2.nmt;
     f.nmt=f1.nmt*f2.nrt;
     return f;}
void fractie::afisare()
    {cout<<"f="<<nrt<<'/'<<nmt<<'\n';}
fractie fractie::operator=(const fractie f1)
    { nmt=f1.nmt;nrt=f1.nrt; return *this;}
fractie fractie::operator+=(const fractie f1){
    int dc=cmmdc(nmt,f1.nmt);
    nmt=(nmt/dc)*f1.nmt;
    nrt=nrt*(f1.nmt/dc)+f1.nrt*(nmt/dc);
    simplifica();
    return *this;}
fractie fractie::operator-=(const fractie f1){
    int dc=cmmdc(nmt,f1.nmt);
    nmt=(nmt/dc)*f1.nmt;
    nrt=nrt*(f1.nmt/dc)-f1.nrt*(nmt/dc);
    simplifica();
    return *this;}
fractie fractie::operator *=(const fractie f1){
    int dc;
    dc=cmmdc(nrt,f1.nmt);
    if (dc>1) {
        nrt/=dc;f1.nmt/=dc;}
    dc=cmmdc(f1.nrt,nmt);
    if (dc>1) {
        f1.nrt/=dc;nmt/=dc;}
    nrt=nrt*f1.nrt;
    nmt=nmt*f1.nmt;  
    simplifica();
    return *this;}
fractie operator /=(const fractie f1){    
    int dc;dc=cmmdc(nrt,f1.nrt);
    if (dc>1) {
        nrt/=dc;
        f1.nrt/=dc;}
    dc=cmmdc(f1.nmt,nmt);
    if (dc>1) {
        f1.nmt/=dc;nmt/=dc;}
nrt=nrt*f1.nmt;
nmt=nmt*f1.nrt;
return *this;}

